const { defineConfig } = require('@vue/cli-service')
const path = require('path')

function resolve (dir) {
  return path.join(__dirname, dir)
}

// eslint-disable-next-line no-unused-vars
const isProd = process.env.NODE_ENV === 'production'

var webpack = require('webpack')

//const WebpackObfuscator = require('webpack-obfuscator');
// eslint-disable-next-line no-unused-vars
const assetsCDN = {
  // webpack build externals
  externals: {
    axios: 'axios',
    "core-js": 'core-js',
    vue: 'Vue',
    'vue-router': 'VueRouter',
    vuex: 'Vuex',
    echarts: 'echarts',
    'jquery': 'jQuery'
    // 'echarts-gl': 'echarts-gl',
  },
  css: [
  ],
  // https://unpkg.com/browse/vue@2.6.10/
  js: [
    "https://cdn.staticfile.org/axios/1.3.6/axios.min.js",
    "https://cdn.staticfile.org/core-js/3.30.1/minified.js",
    "https://cdn.staticfile.org/vue/2.6.14/vue.min.js",
    "https://cdn.staticfile.org/vue-router/3.5.1/vue-router.min.js",
    "https://cdn.bootcdn.net/ajax/libs/vuex/3.6.2/vuex.min.js",
    "https://cdn.staticfile.org/echarts/5.4.2/echarts.min.js",
    "https://cdn.staticfile.org/jquery/3.6.4/jquery.min.js"
  ]
}

// const CompressionWebpackPlugin = require('compression-webpack-plugin');
// gzip压缩文件配置
// const productionGzipExtensions = ['js', 'css'];

module.exports = defineConfig({
  transpileDependencies: true,
  publicPath: './',
  outputDir: 'gyc',
  assetsDir: 'static',
  productionSourceMap: false,
  lintOnSave: true,
  // productionGzip:true,
  // devServer: {
  //   proxy: {
  //     [process.env.VUE_APP_BASE_API]: {
  //       target: 'https://dongman.zhongduyun.com/dmhj',
  //       ws: false,
  //       changeOrigin: true,
  //       pathRewrite: {
  //         ['^' + process.env.VUE_APP_BASE_API]: ''
  //       }
  //     }
  //   }
  //   // before: require('./mock/mock-server.js')
  // },
  configureWebpack: {
    // provide the app's title in webpack's name field, so that
    // it can be accessed in index.html to inject the correct title.
    resolve: {
      alias: {
        '@': resolve('src')
      }
    },
    externals: isProd ? {} : {},
    plugins: [
      new webpack.ProvidePlugin({
        $: "jquery",
        jQuery: "jquery",
        "windows.jQuery": "jquery"
      })
    ]

    // plugins: [
    //   new WebpackObfuscator({
    //     // 压缩代码
    //     compact: true,
    //     // 是否启用控制流扁平化(降低1.5倍的运行速度)
    //     controlFlowFlattening: true,
    //     // 应用概率;在较大的代码库中，建议降低此值，因为大量的控制流转换可能会增加代码的大小并降低代码的速度。
    //     controlFlowFlatteningThreshold: 0.75,
    //     // 随机的死代码块(增加了混淆代码的大小)
    //     deadCodeInjection: true,
    //     // 死代码块的影响概率
    //     deadCodeInjectionThreshold: 0.4,
    //     // 此选项几乎不可能使用开发者工具的控制台选项卡
    //     debugProtection: false,
    //     // 如果选中，则会在“控制台”选项卡上使用间隔强制调试模式，从而更难使用“开发人员工具”的其他功能。
    //     debugProtectionInterval: 0,
    //     // 通过用空函数替换它们来禁用console.log，console.info，console.error和console.warn。这使得调试器的使用更加困难。
    //     disableConsoleOutput: true,
    //     // 标识符的混淆方式 hexadecimal(十六进制) mangled(短标识符)
    //     identifierNamesGenerator: 'hexadecimal',
    //     log: false,
    //     // 是否启用全局变量和函数名称的混淆
    //     renameGlobals: false,
    //     // 通过固定和随机（在代码混淆时生成）的位置移动数组。这使得将删除的字符串的顺序与其原始位置相匹配变得更加困难。如果原始源代码不小，建议使用此选项，因为辅助函数可以引起注意。
    //     rotateStringArray: true,
    //     // 混淆后的代码,不能使用代码美化,同时需要配置 cpmpat:true;
    //     selfDefending: true,
    //     // 删除字符串文字并将它们放在一个特殊的数组中
    //     stringArray: true,
    //     stringArrayEncoding: ['base64'],
    //     stringArrayThreshold: 0.75,
    //     transformObjectKeys: true,
    //     // 允许启用/禁用字符串转换为unicode转义序列。Unicode转义序列大大增加了代码大小，并且可以轻松地将字符串恢复为原始视图。建议仅对小型源代码启用此选项。
    //     unicodeEscapeSequence: false
    //   }, []),
    // ]
  },
  chainWebpack (config) {
    if (isProd) {
      config.plugin('html').tap(args => {
        args[0].cdn = {}
        return args
      })

      config.plugin('webpack-bundle-analyzer')
        .use(require('webpack-bundle-analyzer').BundleAnalyzerPlugin)

    }

    config
      .when(process.env.NODE_ENV !== 'development',
        config => {
          //config.entry('app').clear().add('./src/main-prod.js')
          // config
          //   .plugin('ScriptExtHtmlWebpackPlugin')
          //   .after('html')
          //   .use('script-ext-html-webpack-plugin', [])

          //   .end()
          // config.plugin('CompressionPlugin').use(
          //   new CompressionWebpackPlugin({
          //     test: /\.(js|css)$/,
          //     threshold: 10240, // 超过10kb的文件就压缩
          //     deleteOriginalAssets:true, // 不删除源文件
          //     minRatio: 0.8
          //   })
          // )

          config
            .optimization.splitChunks({
              chunks: 'all',
              cacheGroups: {
                libs: {
                  name: 'chunk-libs',
                  test: /[\\/]node_modules[\\/]/,
                  // 得益于HTTP2多路复用，不用太担心资源请求太多的问题
                  // name (module) {
                  //   // get the name. E.g. node_modules/packageName/not/this/part.js
                  //   // or node_modules/packageName
                  //   const pathName = module.context.match(/[\\/]node_modules[\\/](.*?)([\\/]|$)/);
                  //   console.log('pathName', pathName);
                  //   const packageName = module.context.match(/[\\/]node_modules[\\/](.*?)([\\/]|$)/)[1]
                  //   // npm package names are URL-safe, but some servers don't like @ symbols
                  //   return `npm.${packageName.replace('@', '')}`
                  // },
                  priority: 10,
                  chunks: 'initial' // only package third parties that are initially dependent
                },
                // elementUI: {
                //   name: 'chunk-elementUI', // split elementUI into a single package
                //   priority: 20, // the weight needs to be larger than libs and app or it will be packaged into libs or app
                //   test: /[\\/]node_modules[\\/]_?element-ui(.*)/ // in order to adapt to cnpm
                // },
                commons: {
                  name: 'chunk-commons',
                  test: resolve('src/components'), // can customize your rules
                  minChunks: 3, //  minimum common number
                  priority: 5,
                  reuseExistingChunk: true
                }
              }
            })
          // https:// webpack.js.org/configuration/optimization/#optimizationruntimechunk
          //config.optimization.runtimeChunk('single')
        }
      )
  }
})
